package com.srx.openfeign.feign;

import com.srx.openfeign.dto.BookDTO;
import com.srx.openfeign.dto.NoticeDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import java.util.List;

/**
 * 图书与Elasticsearch服务之间的Feign接口
 * @author srx
 */
@FeignClient("elasticsearch-service")
public interface BookToElasticsearch
{

    /**
     * 获取所有图书的数量
     * @return 图书总数
     */
    @GetMapping("/elasticsearch/book/count")
    long getAllBookCount();
    
    /**
     * 根据分类ID获取图书数量
     * @param id 分类ID
     * @return 该分类下的图书数量
     */
    @GetMapping("/elasticsearch/book/category-count/{id}")
    long getCategoryBookCount(@PathVariable("id") int id);

	/**
     * 根据分类ID获取图书ID列表
     * @param page 页码
     * @param size 每页数量
     * @param categoryId 分类ID
     * @return 指定页的图书列表
     */
    @GetMapping("/elasticsearch/book/category-book/{page}/{size}/{categoryId}")
    List<String> getBookIdListByCategoryId(@PathVariable("page") int page, @PathVariable("size") int size, @PathVariable("categoryId") int categoryId);

    /**
     * 根据图书名称和分类ID获取推荐图书的ID列表
     * @param name 图书名称
     * @param categoryId 分类ID
     * @return 推荐图书的ID列表
     */
    @GetMapping("/elasticsearch/book/recommend-book/{name}/{categoryId}")
    List<Integer> getRecommendBookListById(@PathVariable("name") String name, @PathVariable("categoryId") int categoryId);

    /**
     * 根据搜索词获取该分类下的图书数量
     * @param searchTerm 搜索词
     * @return 该分类下的图书数量
     */
    @GetMapping("/elasticsearch/book/search-count/{searchTerm}")
    long getSearchTermBookCount(@PathVariable("searchTerm") String searchTerm);

	/**
     * 根据搜索词获取指定搜索词图书列表
     * @param page 页码
     * @param size 每页数量
     * @param searchTerm 搜索词
     * @return 搜索结果列表
     */
    @GetMapping("/elasticsearch/book/search-book/{page}/{size}/{searchTerm}")
    List<BookDTO> getSearchTermBookListBySearchTerm(@PathVariable("page") int page, @PathVariable("size") int size, @PathVariable("searchTerm") String searchTerm);

    /**
     * 根据用户ID获取正在借阅图书数量
     * @param userId 用户ID
     * @return 借阅图书数量
     */
    @GetMapping("/elasticsearch/book/borrow-count/{userId}")
    long getBorrowingCountById(@PathVariable("userId") int userId);

    /**
     * 根据用户ID获取正在借阅图书ID列表
     * @param userId 用户ID
     * @return 正在借阅图书ID列表
     */
    @GetMapping("/elasticsearch/book/borrowing-book/{userId}")
    List<String> getBorrowingIdListById(@PathVariable("userId") int userId);

    /**
     * 根据用户ID获取所有借阅图书ID列表
     * @param userId 用户ID
     * @return 所有借阅图书ID列表
     */
    @GetMapping("/elasticsearch/book/borrow-book/{userId}")
    List<String> getAllBorrowBookListById(@PathVariable("userId") int userId);

    /**
     * 获取所有待删除的借阅信息的ID列表
     * @return 所有待删除的借阅图书ID列表
     */
    @DeleteMapping("/elasticsearch/book/borrowing")
    List<String> getDeleteBorrowingIdList();

    /**
     * 根据用户ID获取已归还的借阅图书总数量
     * @param userId 用户ID
     * @return 借阅图书数量
     */
    @GetMapping("/elasticsearch/book/return-count/{userId}")
    long getReturnCountById(@PathVariable("userId") int userId);

    /**
     * 根据用户ID和搜索词获取借阅图书列表
     * @param userId 用户ID
     * @param searchTerm 搜索词
     * @return 借阅图书列表
     */
    @GetMapping("/elasticsearch/book/borrow-book/{userId}/{searchTerm}")
    List<String> getBorrowBookListBySearch(@PathVariable("userId") int userId, @PathVariable("searchTerm") String searchTerm);


    /**
     * 获取所有图书馆公告数量
     * @return 公告数量
     */
    @GetMapping("/elasticsearch/book/notice-count")
    long getAllLibraryNoticeCount();


    /**
     * 根据搜索词获取图书馆公告数量
     * @param searchTerm 搜索词
     * @return 公告数量
     */
    @GetMapping("/elasticsearch/book/search-notice-count/{searchTerm}")
    long getSearchLibraryNoticeCount(@PathVariable("searchTerm") String searchTerm);

	/**
     * 根据搜索词获取指定搜索词的图书馆公告列表
     * @param page 页码
     * @param size 每页数量
     * @param searchTerm 搜索词
     * @return 搜索结果列表
     */
    @GetMapping("/elasticsearch/book/search-notice/{page}/{size}/{searchTerm}")
    List<NoticeDTO> getSearchLibraryNoticeByPage(@PathVariable("page") int page, @PathVariable("size") int size, @PathVariable("searchTerm") String searchTerm);

    /**
     * 获取所有待删除的图书馆公告ID列表
     * @return 所有待删除的图书馆公告ID列表
     */
    @DeleteMapping("/elasticsearch/book/notice")
    List<Integer> getDeleteLibraryNoticeIdList();

}
